package com.mlh.doublepointer;

/**
 * @author 缪林辉
 * @date 2024/8/13 16:19
 * @DESCRIPTION
 */
// 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
// 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
// 输入: nums = [0,1,0,3,12]
// 输出: [1,3,12,0,0]
public class 移动零 {
    //忘记需要保持相对顺序了
    public void method1(int[] nums) {
        int head = 0;
        int tail = nums.length - 1;
        while (head < tail) {
            while (nums[head] != 0) {
                head++;
            }
            while (nums[tail] == 0) {
                tail--;
            }
            nums[head] = nums[head] ^ nums[tail];
            nums[tail] = nums[head] ^ nums[tail];
            nums[head] = nums[head] ^ nums[tail];
            head++;
            tail--;
        }
    }

    public void method2(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]!=0){
                continue;
            }
            int tail=i+1;
            while(tail<nums.length&&nums[tail]==0){
                tail++;
            }
            if(tail>=nums.length){
                return;
            }
            nums[i]=nums[tail]^nums[i];
            nums[tail]=nums[tail]^nums[i];
            nums[i]=nums[tail]^nums[i];
        }
    }

    //两次遍历即可  第一次遍历把非0的数排到前面
    //第二次遍历把后面的数变为0即可
    public void method3(int[] nums) {
        int tail=0;
        for (int i = 0; i <nums.length ; i++) {
            if(nums[i]!=0){
                nums[tail]=nums[i];
                tail++;
            }
        }
        for (int i = tail; i < nums.length; i++) {
            nums[i]=0;
        }
    }

    public void practice(int[] nums) {
        int tail=0;
        for (int i = 0; i < nums.length; i++) {
            if(nums[i]!=0){
                nums[tail++]=nums[i];
            }
        }
        for (int i = tail; i < nums.length; i++) {
            nums[i]=0;
        }
    }
}
